/*
 * 北太天元（Baltamatica）支持工具箱的工具头文件。
 *
 * 本文件为工具箱提供了一个检查工具箱的状态的工具，工具箱开发者
 * 不应该修改此文件，而应该在 config.h 中定义相应的宏变量
 *
 * 适用于当前版本的北太天元。
 *
 * 版权所有 © 2021-2024，北太振寰（重庆）科技有限公司
 */

#ifndef BALTAM_TOOLBOX_UTILS_H
#define BALTAM_TOOLBOX_UTILS_H

#include "bex/bex.h"
#include "config.h"
#include <stdexcept>

#define _TOOLBOX_UTILS_ERR_MSG \
    "工具箱 [" TOOLBOX_NAME "] 可能正在被未经授权访问，拒绝运行！"

/*
 * 检查工具箱的状态，如果工具箱可能正在被未经授权访问，则抛出错误。
 * 此函数一般用于被保护的函数开头处。
 */
static inline int check_status(void) {
    static volatile unsigned int status = 0;
    if (status == SUCCESS_STATUS) {
        // 授权验证通过
        return 0;
    } else if (status == ~SUCCESS_STATUS) {
        // 授权验证未通过
        throw std::runtime_error(_TOOLBOX_UTILS_ERR_MSG);
        return 1;
    } else {
        int toolbox_id = TOOLBOX_ID;
        bool *result =
            (bool *)bxF2KQuery("toolbox_auth_status_by_id", &toolbox_id);
        if (result != NULL && (*result)) {
            // 授权验证通过
            status = SUCCESS_STATUS;
            return 0;
        } else {
            // 授权验证未通过
            status = ~SUCCESS_STATUS;
            throw std::runtime_error(_TOOLBOX_UTILS_ERR_MSG);
            return 1;
        }
    }
}

#undef _TOOLBOX_UTILS_ERR_MSG
#undef TOOLBOX_NAME
#undef TOOLBOX_ID
#undef SUCCESS_STATUS

#endif
